home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DS-CD ROM 2 1993 August
/
DS CD-ROM 2.Ausgabe (August 1993).iso
/
programm
/
ds0257
/
demo.exe
/
DEMOS.INC
< prev
next >
Wrap
Text File
|
1992-02-16
|
8KB
|
339 lines
; ----------------------------
; DEMOS.INC - allgemeine Routinen für die Demos
;
; ----------------------------
; ShowLogo
;
; Funktion: Ausgabe des Logos und verkleinern des akt. Speicherblocks auf
; 1 Segment
;
; Eingabe: ES = DS = CS
;
ShowLogo:
mov ax,0
jmp >l1
; ----------------------------
; ShowLogoAndAsk
;
; Funktion: Ausgabe des Logos, verkleinern des akt. Speicherblocks auf
; 1 Segment und Lesen einer Taste
;
; Eingabe: ES = DS = CS
;
; Bes.: Falls die Taste <ESC> eingegeben wird, wird das Programm
; abgebrochen. (Errorlevel = 1)
;
MakeMsg AbbortMsg, '*** Programm abgebrochen.'
ShowLogoAndAsk:
mov ax,01
l1:
push ax
Write_String Logo ; Logo ausgeben
; akt. Speicherblock verkleinern
mov bx,01000h
mov ah,04Ah
int 021h ; (keine Fehlerbehandlung)
pop ax ; AX = 0 ->> keine Taste lesen
; AX = 1 ->> Taste lesen
or ax,ax
jz ret ; keine Taste lesen
cmp b[019h],01
jne ret ; Umleitung der Standard-Ausgabe in Kraft
; ----------------------------
mov ah,01h ; Taste lesen
int 021h
cmp al,ESC
jne >l1
; ESC gedrückt, Programm abbrechen
Write_String AbbortMsg
EndProcess 01 ; *** Programm abbrechen!
; ------------------
l1:
cmp al,00h ; Funktionstaste eingegeben?
jne >l2
mov ah,01h ; ja, zweiten Code lesen
int 021h
; ----------------------------
l2:
call ShowCR_LF
ret
; ----------------------------
; CloseFiles
;
; Funktion: Schließt alle offenen Dateien
;
CloseFiles:
pushf
push ax,bx,cx,si,ds
cld
mov cx,cs:[032h] ; CX = Anzahl möglicher Handles
lds si,cs:[034h] ; DS:SI -> Handle-Tabelle
xor bx,bx
l00:
lodsb ; AL = akt. internes Handle
cmp al,0FFh
je >l01 ; Handle ist geschlossen
; Handle schließen
mov ah,03Eh
int 021h
l01:
inc bx
loop l00
pop ds,si,cx,bx,ax
popf
ret
; ----------------------------
; LaufzeitAnzeige
;
; Funktion: Ausgabe einer Laufzeit-Anzeige
;
PunktZaehler db 0
Punkt db CR,'.-'
LaufzeitAnzeige:
cmp b cs:[019],01
jne ret ; Laufzeitausgabe nicht ausgeben, falls die
; Standard-Ausgabe umgeleitet wird
push ds,bx,cx,dx ; Laufzeitangabe ausgeben
push cs
pop ds
mov cx,1
mov dx,offset Punkt+1
inc PunktZaehler
cmp PunktZaehler,40xD
jb >l1
; Cursor zurücksetzen
mov cx,2
dec dx
mov ax,W Punkt+1
xchg ah,al
mov W Punkt+1,ax
mov PunktZaehler,0
l1:
call OutputMsg
pop dx,cx,bx,ds
ret
; ----------------------------
; OutputMsg
;
; Funktion: Ausgabe einer Zeichenkette auf das Handle Standard-Error
;
; Eingabe: DX = Offset der Zeichenkette
; CX = Länge der Zeichenkette
;
OutputMsg:
push ax,bx,ds
mov ds,cs
mov ah,040h
mov bx,STDOut
int 021h
pop ds,bx,ax
ret
; ----------------------------
; ShowCR_LF
;
; Funktion: Ausgabe von CR und LF
;
MakeMsg1 CR_LF ,CR,LF
ShowCR_LF:
push cx,dx
mov dx,offset CR_LF
mov cx,CR_LF_Length
call OutputMsg
pop dx,cx
ret
; ----------------------------
; ShowPause
;
; Funktion: Gibt eine Meldung auf die Standard-Ausgabe aus und wartet auf
; eine Taste (nur falls die Ausgabe auf den Bildschirm geht)
;
; Ausgabe: CF = 0 -> Taste <> ESC gedrückt
; CF = 1 -> ESC gedrückt
; AL = Taste
;
MakeMsg1 PauseMSG, CR,LF, 'Bitte eine Taste drücken (ESC = Ende) ...'
ShowPause:
push ds
push bx,cx,dx
cmp b cs:[019h],01h ; [019h] -> Handle für die Standard-Ausgabe
clc
jne >l9 ; Ausgabe geht in eine Datei
mov ds,cs
; Meldung ausgeben
WRITE_STRING PauseMSG
l0:
mov ah,08h ; Zeichen lesen
int 021h
cmp al,0 ; Funktionstaste gedrückt ?
je l0 ; ja, zweiten Code lesen
cmp al,ESC
clc
if e stc
pushf
call ShowCR_LF
popf
l9:
pop dx,cx,bx
pop ds
ret
; ----------------------------
; Konvert_AX_To_HexString
;
; Funktion: Konvertiert AX zu eine 4-stellige Zeichenkette in Hexadezimal-
; Form nach ES:DI
;
; Eingabe: AX = Zu konvertierender Wert
; ES:DI -> Puffer für 4 Zeichen
;
; Ausgabe: Puffer gefüllt
; DI zeigt hinter den Puffer
;
Konvert_AX_To_HexString:
push ax
mov al,ah
call Konvert_AL_To_Hexstring
pop ax
; ...
; ----------------------------
; Konvert_AL_To_Hexstring
;
; Funktion: Konvertiert AL in eine 2-stellige Zeichenkette in Hexadezimal-
; Form nach ES:DI
;
; Eingabe: AL = zu konvertierenden Wert
; ES:DI -> Puffer für 2 Zeichen
;
; Ausgabe: Puffer gefüllt
; DI zeigt hinter den Puffer
;
Konvert_AL_To_HexString:
cld
mov ah,al
and ah,0F0h
shr ah,1
shr ah,1
shr ah,1
shr ah,1
cmp ah,9
jg >l1
add ah,'0'
jmp >l2
l1:
add ah,'7'
l2:
and al,00Fh
cmp al,9
jg >l1
add al,'0'
jmp >l2
l1:
add al,'7'
l2:
xchg ah,al
stosw
ret
; ----------------------------
; Konvert_AL_To_Dezstring
;
; Funktion: Konvertiert (vorzeichenlos) AL zu einem Dezimal-String bei ES:DI
;
; Eingabe: AL = zu konvertierender Wert
;
; Ausgabe: Dezstring bei ES:DI
;
Konvert_AL_To_Dezstring:
push cx,dx
xor ah,ah
mov dx,ax
mov cs:k1,ah
jmp >l1
; ----------------------------
; Konvert_AX_To_Dezstring
;
; Funktion: Konvertiert (vorzeichenlos) AX zu einem Dezimal-String bei ES:DI
;
; Eingabe: AX = zu konvertierender Wert
;
; Ausgabe: Dezstring bei ES:DI
;
k1 db 0 ; Hilfsvariable
StoreDigit0:
mov ax,dx
StoreDigit1:
xor dx,dx
div cx
cmp al,0
jne >l01
cmp cs:k1,al
jne >l01
mov al,' '
jmp >l02
l01:
add al,'0'
mov cs:k1,al
l02:
stosb
ret
Konvert_AX_To_Dezstring:
push cx,dx
mov cs:k1,0
mov cx,10000xD
call StoreDigit1
mov cx,1000xD
call StoreDigit0
l1:
mov cx,100xD
call StoreDigit0
mov cx,10xD
call StoreDigit0
mov al,dl
add al,'0'
stosb
pop dx,cx
ret